﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls.WebParts;
using Acamps.Framework.BancoDados;
using Acamps.Framework.SessionFactory;

namespace Acamps.Framework.NegocioRegras
{
    public class FichasNegocio
    {
        private AcessoDados _acessoDados;
        private String _conectionString;

        internal FichasNegocio(string conexao)
        {
            _conectionString = conexao;
            _acessoDados = new AcessoDados(conexao);
        }

        public Ficha AlteracaoFicha(Ficha ficha)
        {
            var fichaRet = _acessoDados.Entidade.Fichas.FirstOrDefault(x => x.Id == ficha.Id);

            fichaRet.IdTipoParticipacao = ficha.IdTipoParticipacao;
            fichaRet.Paroquia = ficha.Paroquia;
            fichaRet.BairroParoquia = ficha.BairroParoquia;
            fichaRet.Batizado = ficha.Batizado;
            fichaRet.PrimeiraComunhao = ficha.PrimeiraComunhao;
            fichaRet.Crisma = ficha.Crisma;
            fichaRet.Permanencia = ficha.Permanencia;
            fichaRet.Movimento = ficha.Movimento;
            fichaRet.RestricaoFisica = ficha.RestricaoFisica;
            fichaRet.Medicamento = ficha.Medicamento;
            fichaRet.Acampou = ficha.Acampou;
            fichaRet.Dieta = ficha.Dieta;
            fichaRet.ComoEncontrou = ficha.ComoEncontrou;
            fichaRet.Indicacao = ficha.Indicacao;
            fichaRet.Conhece = ficha.Conhece;
            fichaRet.Alergia = ficha.Alergia;

            _acessoDados.Entidade.SaveChanges();

            return fichaRet;
        }

        public Ficha RetornarFichaPorId(Guid idFicha)
        {
            var ficha = _acessoDados.Entidade.Fichas.FirstOrDefault(x => x.Id == idFicha);
            if (ficha != null)
            {
                if (!ficha.CampistaReference.IsLoaded) ficha.CampistaReference.Load();
                if (!ficha.EventoReference.IsLoaded) ficha.EventoReference.Load();
                if (!ficha.Evento.LocalReference.IsLoaded) ficha.Evento.LocalReference.Load();
            }

            return ficha;
        }

        public Ficha RetornarFicha(Guid idCampista)
        {
            var ficha = _acessoDados.Entidade.Fichas.FirstOrDefault(x => x.IdCampista == idCampista);
            if (ficha != null)
            {
                if (!ficha.CampistaReference.IsLoaded) ficha.CampistaReference.Load();
                if (!ficha.EventoReference.IsLoaded) ficha.EventoReference.Load();
                if (!ficha.Evento.LocalReference.IsLoaded) ficha.Evento.LocalReference.Load();
            }

            return ficha;
        }

        public IQueryable<Ficha> ListarPorAcampamento(Guid idAcampamento)
        {
            var campistas = _acessoDados.Entidade.Fichas.Where(x => x.IdEvento == idAcampamento);
            if (campistas != null)
            {
                foreach (var campista in campistas)
                {
                    if (!campista.CampistaReference.IsLoaded) campista.CampistaReference.Load();
                    if (!campista.EventoReference.IsLoaded) campista.EventoReference.Load();
                    if (!campista.Evento.LocalReference.IsLoaded) campista.Evento.LocalReference.Load();
                    if(!campista.TipoParticipacaoReference.IsLoaded)campista.TipoParticipacaoReference.Load();
                }
            }

            return campistas.OrderBy(x => x.IdTipoParticipacao);
        }

        public IQueryable<Ficha> ListarPorAcampamentoConfirmados(Guid idAcampamento)
        {
            var campistas = _acessoDados.Entidade.Fichas.Where(x => x.IdEvento == idAcampamento && x.TipoParticipacao.Referencia == "#TipoParticipacao.Confirmado");
            if (campistas != null)
            {
                foreach (var campista in campistas)
                {
                    if (!campista.CampistaReference.IsLoaded) campista.CampistaReference.Load();
                    if (!campista.EventoReference.IsLoaded) campista.EventoReference.Load();
                    if (!campista.Evento.LocalReference.IsLoaded) campista.Evento.LocalReference.Load();
                    if (!campista.TipoParticipacaoReference.IsLoaded) campista.TipoParticipacaoReference.Load();
                }
            }

            return campistas;
        }
    }
}
